package thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

//实际开发中更偏向 Ruuable的run()方法
public class Demo36 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //Callable 并没有真在执行 需要搭配thread
        //Callable 泛型 里面的call方法 相比于Ruuable中run方法 有返回值 不能直接传入thread中
        //需要借助 FutureTask Ruuable里面需要借助定义static一个类型进行run()方法访问
        Callable<Integer> callable = new Callable<Integer>() {
            public Integer call() throws Exception {
                int sum=0;
                for (int i = 1; i <= 100; i++) {
                    sum+=i;
                }
                return sum;
            }
        };
        FutureTask<Integer> futureTask=new FutureTask<>(callable);
        Thread thread=new Thread(futureTask);
        thread.start();
        //get()方法没有拿到结果会一直阻塞等待
        //futureTask.get()方法会阻塞等待 等待get方法执行完毕后会返回值 而实现Ruuable的run方法 需要额外调用thread.join()
        System.out.println(""+futureTask.get());
        /*Callable 通常需要搭配 FutureTask 来使⽤. FutureTask ⽤来保存 Callable 的返回结果. 因为
Callable 往往是在另⼀个线程中执⾏的, 啥时候执⾏完并不确定.
FutureTask 就可以负责这个等待结果出来的⼯作*/
    }
}
